package com.hotel.service.impl;

import com.hotel.component.IocContainer;
import com.hotel.dao.NotifyDao;
import com.hotel.entity.Notify;
import com.hotel.entity.PageBean;
import com.hotel.exception.CustomUploadException;
import com.hotel.exception.EntityException;
import com.hotel.service.NotifyService;
import com.hotel.utils.JdbcUtils;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @Author Str
 * @Date 2021/11/1 15:50
 * @Description :
 */
public class NotifyServiceImpl implements NotifyService {
    //{1}在这里来装配 NotifyDao 的实例对象
    private NotifyDao notifyDao = (NotifyDao) IocContainer.getBean("NotifyDao");


    //{2}设置公告上传的位置 (创建好该目录)
    public static final String UPDIR = "D:\\Projects\\upload\\";

    //{2}在控制器层调用此方法
    //   {a}实现文件的上传。
    //   {b}实现数据库的信息保存。
    @Override
    public void saveNotify(Notify notify)
            throws Exception {
        //{1}获取数据库连接
        Connection conn = JdbcUtils.getConnection();
        //{2}设置自动提交为 false
        conn.setAutoCommit(false);
        try {
            //{3}设置 uuid 到 notify
            String uuid = UUID.randomUUID().toString();
            uuid = uuid.replace("-", "");
            notify.setId(uuid);

            //{4}先写数据库(写不去会抛出异常)
            //   [同名异常(客户), sql格式(程序员)]
            notifyDao.addNotify(notify);

            //{5}目录是否存在, 没有 --> 创建目录
            String path = UPDIR + notify.getFileName();
            File file = new File(UPDIR);
            boolean isOK;
            if (!file.exists()) {
                isOK = file.mkdirs();
                if (!isOK) {   //创建目录失败 --> 异常
                    throw new CustomUploadException(
                            CustomUploadException.PATH_ERROR);
                }
            }
            //{6}文件是否已存在, 存在 --> 异常
            File newFile = new File(path);
            if (newFile.exists()) {
                throw new CustomUploadException(
                        CustomUploadException.FILE_EXISTS);
            }
            //{7}正式写入文件(如果发生异常直接上抛到控制器)
            notify.getFileItem().write(newFile);
            //{8}提交事务..
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            String msg = e.getMessage();
            boolean isRepeat = msg.contains("Duplicate entry");
            if (isRepeat) {
                throw new CustomUploadException(
                        CustomUploadException.NAME_EXISTS);
            } else {
                throw new CustomUploadException(
                        CustomUploadException.OTHER_ERROR);
            }
        } finally {
            //{8}关闭连接.
            JdbcUtils.closeConnection();
        }
    }

    @Override
    public void updateNotify(Notify notify) throws EntityException, SQLException {
        //{ps}这里要同时处理两件事情 [更新]
        //{1}获取数据库连接.
        Connection conn = JdbcUtils.getConnection();
        //{2}开启事务功能 [自动提交关闭]
        conn.setAutoCommit(false);
        try {
            notifyDao.update(notify);
            //{4}提交事务
            conn.commit();
        } finally {
            conn.close();
        }
    }

    // 更新下载信息
    @Override
    public void growDownloadCnt(String id) throws SQLException {
        Connection conn = JdbcUtils.getConnection();
        conn.setAutoCommit(false);
        try {
            notifyDao.growDownloadCnt(id);
            conn.setAutoCommit(true);
        } finally {
            conn.close();
        }
    }

    @Override
    public Notify getNotifyById(String id) throws SQLException, EntityException {
        Notify notify = notifyDao.getNotifyById(id);
        System.out.println("getNotifyById:" + notify);
        return notify;
    }

    @Override
    public PageBean<Notify> getNotifyList(Map<String, Object> map) throws SQLException {
        //{1}从 map 中获取 page, limit。
        Integer page = (Integer) map.get("page");
        Integer limit = (Integer) map.get("limit");
        //{2}查询结果记录偏移量
        int offset = (page - 1) * limit;
        //{3}再将它们从 map 中移除。
        map.remove("page");
        map.remove("limit");
        //{4}创建 PageBean
        PageBean<Notify> pBean = new PageBean<>();
//        try{
        //{5}获取搜索关键字的 SQL 片段
        String schSQL = notifyDao.getSearchSQL(map);
        //{6}获取当前查询到的记录数。
        int count = notifyDao.getCount(schSQL);
        //{7}获取当前查询到的记录数据。
        List<Notify> list = notifyDao.getList(schSQL, offset, limit);
        //{8}设置记录数
        pBean.setCount(count);
        //{9}设置 列表数据
        pBean.setList(list);
//        }finally{
//            //{ps}关闭连接。
//            JdbcUtils.closeConnection();
//        }
        return pBean;
    }

    @Override
    public void deleteNotify(String id) throws SQLException, EntityException {
        //{1}获取数据库连接.
        Connection conn = JdbcUtils.getConnection();
        //{2}开启事务功能 [自动提交关闭]
        conn.setAutoCommit(false);
        try {
            int ret = notifyDao.delete(id);
            if (ret != 1) {
                throw new EntityException("删除失败。");
            }
            //{4}提交事务
            conn.commit();
        } finally {
            conn.close();
        }
    }
}
